package com.cjq.service;

import com.cjq.bean.Courier;
import com.cjq.bean.Express;
import com.cjq.dao.BaseExpressDao;
import com.cjq.dao.Impl.ExpressDaoMysql;
import com.cjq.exception.CodeException;
import com.cjq.util.RandomUtil;
import com.cjq.util.SMSUtil;
import com.cjq.util.UserUtil;

import java.util.List;
import java.util.Map;

public class ExpressService {

    private static BaseExpressDao dao = new ExpressDaoMysql();


    /**
     * 用于查询数据库中的全部快递（总数+新增），待取件快递（总数+新增）
     *
     * @return [{size:总数，day:新增},{size:总数,day:新增}]    返回一个Map类型的List集合
     */

    public static List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 用户查询所有快递
     *
     * @param limit      是否分页的标记  默认是true 表示分页   false表示查询所有
     * @param offset     起始条数 起始索引
     * @param pageNumber 每页查询的条数
     * @return 快递的集合
     */

    public static List<Express> findAll(boolean limit, int offset, int pageNumber) {
        return dao.findAll(limit, offset, pageNumber);
    }

    /**
     * 根据快递单号，查询快递信息
     *
     * @param number 单号
     * @return 查询快递信息，单号不存在时返回null
     */

    public static Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根据快递单号，查询快递信息
     *
     * @param code 取件码
     * @return 查询快递信息，取件码不存在时返回null
     */

    public static Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根据用户手机号码，查询快递信息 一个用户可以有多个快递
     *
     * @param userPhone 用户手机号码
     * @return 查询快递信息，电话号码不存在时返回null
     */

    public static List<Express> findByUserPhone(String userPhone) {
        return dao.findByUserPhone(userPhone);
    }

    /**
     * 根据录入人手机号码，查询录入人所录入的所有记录
     *
     * @param sysPhone 录入人的到手机号码
     * @return
     */

    public static List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * 快递的录入
     *
     * @param e 录入的快递对象
     * @return 返回boolean类型，true表示成功
     */
//这个更新是不需要修改电话的更新
    public static boolean insert(Express e) {
        //1. 生成取件码   因为取过来的是一个数字  转换为String
        e.setCode(RandomUtil.getCode() + "");

        try {
            boolean flag = dao.insert(e);
            if (flag){
                //录入成功就发送短信（直接在控制台输出的模拟的短信）
                SMSUtil.send(e.getUserPhone(),e.getCode());
            }
            return flag;
        } catch (CodeException codeException) {
            System.out.println("取件码重复的异常被捕抓");
            //这里是因为取件码重复才会引起的异常，这个异常是自定义的，所有可以再一次调用本类的insert方法，再次随机生成取件码，递归的感觉
            return insert(e);
        }
    }

    /**
     * 快递的修改
     *
     * @param id
     * @param newExpress 新的快递对象包括（number,company,userName,status）
     * @return
     */
    //这个更新是有修改电话的更新
    public static boolean update1(int id, Express newExpress) {
        return dao.delete(id)&&insert(newExpress);

    }


    //因为要添加全部的字段，虽然修改的不包括全部字段，但是这个newExpress还是要包含所有添加操作所需的字段
    //这里因为添加的话取件状态肯定是为0，但是如果传进来的修改中有修改状态，那是不合理的，所有应该在页面上设置，
    // 修改手机号，就不能将未取件改为已取件


    //这个添加是没有修改手机号码的更新
    public static boolean update2(int id, Express newExpress) {
        boolean update = dao.update(id, newExpress);    //先修改信息
        Express e = dao.findByNumber(newExpress.getNumber());   //获取修改之后的Express对象
        if (e.getStatus() == 1) {        //如果修改之后的这个快递状态是  已取件，则也要修改出库时间和删除验证码
            updateStatus(e.getCode());
        }
        return update;
    }


    public static boolean delete(int id) {
        return dao.delete(id);
    }


    public static boolean updateStatus(String code) {
        //通过验证码找到对应的快递负责人电话
        Express e = ExpressService.findByCode(code);
        String sysPhone = e.getSysPhone();
        Courier c = CourierService.findBySysPhone(sysPhone);
        int jianShu = c.getJianShu()+1;

        boolean b = CourierService.updateJianShuBySysPhone(jianShu, sysPhone);
        if (b){
            System.out.println("快递负责人所负责的件数加一成功");
        }else {
            System.out.println("快递负责人所负责的件数加一失败");
        }
        //给快递负责人
        return dao.updateStatus(code);
    }

    public static List<Express> findBySysPhoneAndStatus(String sysPhone) {
        return dao.findBySysPhoneAndStatus(sysPhone);
    }

}
